林嶔 (Lin, Chin)
Lesson 1
我們的課程將分成利用R語言,在上半學期逐步學習資料處理、數據分析、圖表製作等基本能力,並練習將常規工作整合成一個pipeline以增加工作效率。
下半學期的課程則跨年授課,分別是『進階資料視覺化及建立網頁App』以及『演算法及機器學習』等兩個方向。
『進階資料視覺化及建立網頁App』的課程著重於前端開發,讓自己的程式能分享給其它不懂程式語言的人使用。
『演算法及機器學習』的課程則著重於後端工程,藉由了解資料科學的原理及應用,讓同學有能力開發自己的人工智慧系統。
R有非常先進的數據視覺化系統
R有很多進階數據分析工具
R是完整的資料科學解決方案
– 與其他統計軟體相比,R語言更接近程式語言,因此在熟悉以後更能建立自己的常規工作pipeline,加快自己的工作效率。
– 與其他程式語言相比,R語言更專注在統計分析功能的開發上,因此相關的功能較完善,比較容易找到合適的函數進行運算。
要開始使用R語言,你必須先到CRAN下載檔案,安裝後才可以使用
除此之外,我建議大家先至Rstudio官網下載Rstudio,它可以使用圖形介面支援一些基礎功能
安裝完畢後,請打開Rstudio,並開啟第一個Project作為第一堂課上課練習之用。
– 請試著在左邊的Console視窗中,輸入下列程式碼,並體會他的計算功能
# 四則運算
123 + 489
145 * 12
# 括弧優先規則
(1 + 2) * 3
# 指數、對數運算
12^4
exp(2)
sqrt(10)
log(3)
log(3, 3)
– 註:物件的屬性有很多種,待會我們再一一介紹
– 注意,等號的右邊為「input」,等號的左邊為「output」
x = 2 * 2 * 3
x
print(x)
x/4
– 函數「c()」中間以逗點為界,此函數可以將不同「物件」合併在同一個物件內
– 注意,以後看到所有文字後馬上連接小括號,都代表著這是一串函數,小括號的內容代表著該函數的「input」,不同函數有不同的「input」,使用時請注意函數的說明內容
x = c(1, 2, 3, 4, 5)
x
x^3
x = c(1, 2, 3, 4, 5)
y = c(6, 7, 9, 8, 10)
y - x
x * y
變數(Variable)層:邏輯(logical)向量、整數(integer)向量、因子(factor)向量、數字(numeric)向量、文字(character)向量
陣列(Array)層:矩陣(matrix)、資料表(data.frame)
列表(List)層:列表(list)、S3物件(S3 class)、S4物件(S4 class)
– 函數「as.XXX()」可以強迫某個向量內所有的內容全部轉換為該種類
– 函數「class()」可以查詢該物件的屬性
a = c(TRUE, FALSE, TRUE, FALSE)
class(a)
b = c(1, 2, 3, 4, 5)
class(b)
b1 = as.integer(b)
class(b1)
c = c(0.7, -0.9, 1.2, -2.1, 3.7)
c1 = as.integer(c)
c1
d = c("A", "B", "C", "C", "B")
class(d)
d1 = as.factor(d)
d1
e = c(c, d)
e
class(e)
e1 = c(c1, d1)
e1
class(e1)
函數「length()」可以查詢該向量的長度
函數「levels()」可以查詢因子向量的類別種類
d = c("A", "B", "C", "C", "B")
class(d)
d1 = as.factor(d)
d1
n = length(d1)
n
categories = levels(d1)
categories
categories = levels(d1)
n.categories = length(categories)
n.categories
# 用下列這串意思一樣
n.categories = length(levels(d1))
n.categories
接著我們將學習利用索引函數叫出物件內的內容
在R裡面,中括號是索引函數,在物件的後面使用中括號,將可以叫出指定位置的內容
y = c(6, 7, 9, 8, 10)
y[1]
y[c(3, 5)]
y[6]
y[7] = 3 * 5
y
y[3] = -1
y
y[3] = y[1] + y[2]
y[6] = y[4] * y[5]
y
– 註,每個人的X不一樣(以下範例數字為3的範例),由老師指定
## [1] 1 3 4 12 16 192 208
y = c(1, 3)
y[3] = y[1] + y[2]
y[4] = y[2] * y[3]
y[5] = y[3] + y[4]
y[6] = y[4] * y[5]
y[7] = y[5] + y[6]
y
## [1] 1 3 4 12 16 192 208
y = c(1, 3)
i = 1
y[i+2] = y[i] + y[i+1]
i = 2
y[i+2] = y[i] * y[i+1]
i = 3
y[i+2] = y[i] + y[i+1]
i = 4
y[i+2] = y[i] * y[i+1]
i = 5
y[i+2] = y[i] + y[i+1]
y
## [1] 1 3 4 12 16 192 208
1 < 2
2 == 1 + 1
"Z" > "B"
x = c(1, 2, 3, 4, 5)
x <= 4
x > 2
x = c(1, 2, 3, 4, 5)
x <= 4 & x > 2
x > 4 | x <= 2
if ("Z" > "B") {x = 2} else {x = 5}
if ("利" > "弊") {y = 3} else {y = 4}
x * y
– 答案是不行的,因為函數「if」的括弧內僅能包含「一個」邏輯值(請同學試試)
x = c(1, 2, 3, 4, 5)
x[x <= 4 & x > 2] = -1
x
費波納奇數列:起始數列為1、1,之後每個數為前兩個數之和
我們可以利用迴圈函數「for」,來創造費波納奇數列
– 在這裡我們需要兩個物件:物件「x」為儲存費波納奇數列的物件,而物件「indexes」代表著隨迴圈變化的物件
x = c(1, 1)
indexes = 3:20
for (i in indexes) {
x[i] = x[i-1] + x[i-2]
}
x
## [1] 1 1 2 3 5 8 13 21 34 55 89 144 233 377
## [15] 610 987 1597 2584 4181 6765
i = 3 #物件「indexes」中的第一個數字
x[i] = x[i-1] + x[i-2]
i = 4 #物件「indexes」中的第二個數字
x[i] = x[i-1] + x[i-2]
i = 20 #物件「indexes」中的最後一個數字
x[i] = x[i-1] + x[i-2]
– 函數「cat」的功能是將文字前後連接起來並輸出在Console視窗中
students = c("小華", "小明", "小王")
scores = c(100, 80, 70)
for (i in 1:3) {
cat(students[i], "的考試成績為", scores[i], "分\n")
}
## 小華 的考試成績為 100 分
## 小明 的考試成績為 80 分
## 小王 的考試成績為 70 分
– 註,每個人的X不一樣(以下範例數字為1的範例),由老師指定
y = c(1, 1)
y[3] = y[1] + y[2]
y[4] = y[2] * y[3]
y[5] = y[3] + y[4]
y[6] = y[4] * y[5]
y[7] = y[5] + y[6]
y[8] = y[6] * y[7]
y[9] = y[7] + y[8]
y[10] = y[8] * y[9]
y
## [1] 1 1 2 2 4 8 12 96 108 10368
y = c(1, 1)
i = 1
y[i+2] = y[i] + y[i+1]
i = 2
y[i+2] = y[i] * y[i+1]
i = 3
y[i+2] = y[i] + y[i+1]
i = 4
y[i+2] = y[i] * y[i+1]
i = 5
y[i+2] = y[i] + y[i+1]
i = 6
y[i+2] = y[i] * y[i+1]
i = 7
y[i+2] = y[i] + y[i+1]
i = 8
y[i+2] = y[i] * y[i+1]
y
y = c(1, 1)
for (i in 1:8) {
if (i == '奇數') {
y[i+2] = y[i] + y[i+1]
} else {
y[i+2] = y[i] * y[i+1]
}
}
y
y = c(1, 1)
for (i in 1:8) {
if (as.integer(i/2) == i/2) {
y[i+2] = y[i] + y[i+1]
} else {
y[i+2] = y[i] * y[i+1]
}
}
y
y = c(1, 1)
for (i in 1:8) {
if ((-1)^i == -1) {
y[i+2] = y[i] + y[i+1]
} else {
y[i+2] = y[i] * y[i+1]
}
}
y
y = c(1, 1)
for (i in 1:8) {
if (i %% 2 == 1) {
y[i+2] = y[i] + y[i+1]
} else {
y[i+2] = y[i] * y[i+1]
}
}
y
– 這個解法的關鍵在於,我們需要改變我們的索引數:
y = c(1, 1)
i = 1
y[2*i+1] = y[2*i-1] + y[2*i]
y[2*i+2] = y[2*i] * y[2*i+1]
i = 2
y[2*i+1] = y[2*i-1] + y[2*i]
y[2*i+2] = y[2*i] * y[2*i+1]
i = 3
y[2*i+1] = y[2*i-1] + y[2*i]
y[2*i+2] = y[2*i] * y[2*i+1]
i = 4
y[2*i+1] = y[2*i-1] + y[2*i]
y[2*i+2] = y[2*i] * y[2*i+1]
y
y = c(1, 1)
for (i in 1:4) {
y[2*i+1] = y[2*i-1] + y[2*i]
y[2*i+2] = y[2*i] * y[2*i+1]
}
y
a = 2
b = 4
x = c(a, b)
indexes = 3:20
for (i in indexes) {
x[i] = x[i-1] + x[i-2]
}
x
## [1] 2 4 6 10 16 26 42 68 110 178 288
## [12] 466 754 1220 1974 3194 5168 8362 13530 21892
Fibonacci = function (a, b) {
x = c(a, b)
indexes = 3:20
for (i in indexes) {
x[i] = x[i-1] + x[i-2]
}
x
}
Fibonacci(2, 4)
## [1] 2 4 6 10 16 26 42 68 110 178 288
## [12] 466 754 1220 1974 3194 5168 8362 13530 21892
Fibonacci = function (a, b, length) {
x = c(a, b)
indexes = 3:length
for (i in indexes) {
x[i] = x[i-1] + x[i-2]
}
x
}
Fibonacci(2, 4, 10)
## [1] 2 4 6 10 16 26 42 68 110 178
Fibonacci(2, 4, 2)
Fibonacci = function (a, b, length) {
if (length < 3) {cat("length必須大於等於3。")} else {
x = c(a, b)
indexes = 3:length
for (i in indexes) {
x[i] = x[i-1] + x[i-2]
}
x
}
}
Fibonacci(2, 4, 2)
## length必須大於等於3。
y = c(1, 1)
y[3] = y[1] + y[2]
y[4] = y[2] * y[3]
y[5] = y[3] + y[4]
y[6] = y[4] * y[5]
y[7] = y[5] + y[6]
y[8] = y[6] * y[7]
y[9] = y[7] + y[8]
y[10] = y[8] * y[9]
y
## [1] 1 1 2 2 4 8 12 96 108 10368
NDMC_func = function (a, b, length) {
if (length < 3) {cat("length必須大於等於3。")} else {
x = c(a, b)
indexes = 3:as.integer(length)
for (i in indexes) {
if ((-1)^i == -1) {
x[i] = x[i-1] + x[i-2]
} else {
x[i] = x[i-1] * x[i-2]
}
}
x
}
}
NDMC_func(a = 1, b = 1, length = 8)
## [1] 1 1 2 2 4 8 12 96
– 我們已經學到下列功能,這些功能對於往後的應用都相當重要: